package ticker 
{
	/**
	 * 所有Ticker的父类
	 * 抽象类
	 * @author gcxk721
	 * @see ticker.TimeTicker
	 * @see ticker.FrameTicker
	 */
	public class Ticker 
	{
		/**
		 * Ticker管理器
		 */
		protected var _manager : ITickerManager;
		
		/**
		 * Ticker时间到的时候的回调函数
		 */
		protected var _tickerFunction : Function;
		
		/**
		 * 所有事件完成后的处理函数
		 */
		protected var _completeFunction : Function;
		
		/**
		 * 当前的运行状态
		 */
		protected var _state : Boolean = false;
		
		/**
		 * Ticker的触发次数
		 * 如果为-1 就表示无限
		 */
		protected var _count : int;
		
		public function Ticker(manager : ITickerManager, tickerFunction : Function = null, completeFunction : Function = null, count : int = -1) 
		{
			if (manager == null)
			{
				throw new Error("ITickerManager is null!!!!");
			}
			_manager = manager;
			_tickerFunction = tickerFunction;
			_completeFunction = completeFunction;
			_state = false;
		}
		
		/**
		 * 改变Ticker的剩余执行次数
		 * @param	count
		 */
		public function setCount(count : int) : void
		{
			_count = count;
		}
		
		/**
		 * 开始Ticker
		 */
		public function start() : void
		{
			if (!_state)
			{
				_manager.addTicker(this);
				_state = true;
			}
		}
		
		/**
		 * 时间到了  进行回调
		 * @param	time
		 */
		public function onTicker(time : int) : void
		{
			if (_tickerFunction != null)
			{
				_tickerFunction.call(null, time);
				if (_count != -1)
				{
					_count--;
					if (_count == 0)
					{
						if (_completeFunction != null)
						{
							_completeFunction.call();
						}
						stop();
					}
				}
			}
		}
		
		/**
		 * 停止Ticker
		 */
		public function stop() : void
		{
			if (_state)
			{
				_manager.delTicker(this);
				_state = false;
			}
		}
		
		/**
		 * 取得Ticker当前的运行状态
		 * true    正在运行
		 * false   没有运行
		 * @return
		 */
		public function getState() : Boolean
		{
			return _state;
		}
		
		/**
		 * 改变当前的TickerManager
		 * 正在运行的Ticker将会自动关闭
		 * 需要手动开启Ticker的再次运行
		 * @param	manager
		 */
		public function changeManager(manager : ITickerManager) : void
		{
			stop();
			_manager = manager;
		}
		
		/**
		 * 改变Ticker的功能回调函数
		 * @param	tickerFunction
		 */
		public function changeTickerFunction(tickerFunction : Function) : void
		{
			_tickerFunction = tickerFunction;
		}
		
		/**
		 * 改变Ticker全部完成后的回调函数
		 * @param	completeFunction
		 */
		public function changeCompleteFunction(completeFunction : Function) : void
		{
			_completeFunction = completeFunction;
		}
		
		/**
		 * 清除资源
		 */
		public function dispose() : void
		{
			_tickerFunction = null;
			_completeFunction = null;
		}
		
	}

}